/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package datos;

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Esteban
 */
public class Manejador_BaseDatos {

    //guardamos la dirección de la base de datos, el nombre de la base y creamos un objeto
    //conection que nos permite hacer el acceso.
    private String _DireccionBase;
    private String _NombreBase;
    private Connection _Conexion;

    public Manejador_BaseDatos(){}
    
    //METODO GENERICO se encarga de hacer la conexión a la base de datos
        public void conectarBaseDatos() throws SQLException
        {
            try
            {
                //Realiza la instancia del driver que une Java y MySQL
                Class.forName("com.mysql.jdbc.Driver");
                //Se realiza la conexion con la base de datos
                _Conexion = DriverManager.getConnection ("jdbc:mysql://localhost/pizzeriasdb","root", "123456");

            }
            catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    
        //METODO GENERICO
        //sirve para los inserts, deletes y updates, no retornan resultsets.
        public void spNoRetornan(String nombreProcedure, Object[] parametros)
        {
            //entra con un vector de objetos, dado que el motor de base de datos sabe que tipo de objeto
            //va adentro por lo que no es necesario hacer cada llamada pegada al Stored procedure
            try
            {
                //creamos el store procedure, con el nombre del SP que se tiene que ejecutar.
                CallableStatement procedimiento = (CallableStatement) _Conexion.prepareCall("{call " +nombreProcedure+ "}");
                int parameter;

            //empezamos a añadir parametros en caso de que el arreglo venga con objetos    
            if (parametros != null)
            {
                //recorremos la lista de objetos para añadirselos al SP
                for (parameter = 0; parameter < parametros.length; parameter++)
                {
                        procedimiento.setObject(parameter+1, parametros[parameter]);
                }
            }
            //ejecutamos el SP 
            procedimiento.executeQuery();
            
            //cerramos el sp para que no hayan leaks
            procedimiento.close();

            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            }
	}
	
        //GENERICO
        //metodo que se utiliza para los select
	public ResultSet spRetornan(String nombreProcedure, Object[] parametros)
        {
           ResultSet contenido = null;

            try {
                //creamos el store procedure, con el nombre del SP que se tiene que ejecutar.
                CallableStatement procedimiento = (CallableStatement) _Conexion.prepareCall("{CALL " +nombreProcedure+ "}");
                int parameter;

            if (parametros != null)
            {
                for (parameter = 0; parameter < parametros.length; parameter++)
                {
                       procedimiento.setObject(parameter+1, parametros[parameter]);
                }
            }
            //hacemos un parseo de los resultados que trae el callableStatement al resultset
            contenido = (ResultSet) procedimiento.executeQuery();
            }
            catch (SQLException ex)
            {
             ex.printStackTrace();
            }
            
            //retornamos el resultado, sea nulo o valores.
            return contenido;
	}

    public void cerrarConexion() throws SQLException
    {
        _Conexion.close();
    }
    /**
     * @return the _DireccionBase
     */
    public String getDireccionBase() {
        return _DireccionBase;
    }

    /**
     * @param DireccionBase the _DireccionBase to set
     */
    public void setDireccionBase(String DireccionBase) {
        this._DireccionBase = DireccionBase;
    }

    /**
     * @return the _NombreBase
     */
    public String getNombreBase() {
        return _NombreBase;
    }

    /**
     * @param NombreBase the _NombreBase to set
     */
    public void setNombreBase(String NombreBase) {
        this._NombreBase = NombreBase;
    }

    public Connection getConexion()
    {
        return _Conexion;
    }
    
}
